package com.wxh.dao.split;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.lang.Nullable;

import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName: DynamicDataSource
 * @Description: 动态切换数据源
 * @Author wxh
 * @Date: 2019/12/6 14:09
 * @Version V1.0.0
 * @Since 1.8
 */
public class DynamicDataSource extends AbstractRoutingDataSource {

    /**
     * 注入主从数据源
     */
    @Resource(name = "masterDataSource")
    private DataSource masterDataSource;
    @Resource(name = "slaveDataSource")
    private DataSource slaveDataSource;

    /**
     * 初始化bean设置值
     */
    @Override
    public void afterPropertiesSet() {
        // 设置默认数据源
        setDefaultTargetDataSource(masterDataSource);
        Map dataSourceMap = new HashMap<>(10);
        // 将两个数据源set入目标数据源
        dataSourceMap.put("master", masterDataSource);
        dataSourceMap.put("slave", slaveDataSource);
        setTargetDataSources(dataSourceMap);

        super.afterPropertiesSet();
    }

    /**
     * spring提供了AbstractRoutingDataSource，提供了动态选择数据源的功能，
     * 替换原有的单一数据源后，即可实现读写分离
     * @return Object
     */
    @Nullable
    @Override
    protected Object determineCurrentLookupKey() {
        // 确定最终的目标数据源
        return DynamicDataSourceHolder.getDbType();
    }
}
